package com.io.files;

import org.junit.Test;

import java.io.File;
import java.io.IOException;

public class Example01 {
    public static void main(String[] args) throws IOException {
        System.out.println("IO流开始学习了");
        /**
         * 构建File 对象（可以传入文件也可以传入目录路径）
         * 绝对路径：E:\JavaProject\java-learning-directory\CommonClass\src\com\io\files\test.txt
         * 相对路径：.\test.text
         * 注意： Windows 是 \\ ,Linux 是 / System.out.println(File.separator);  根据当前平台打印"\"或"/"
         * 绝对路径是完整路径
         * 相对路径是 . 和 .. 相当于当前目录位置
         */
        String url = "E:\\JavaProject\\java-learning-directory\\CommonClass\\src\\com\\io\\files\\";
        File file = new File("E:\\JavaProject\\java-learning-directory\\CommonClass\\src\\com\\io\\files\\test.txt");
        //File file = new File(".\\test.txt");
        // 根据当前平台打印"\"或"/"
        System.out.println(File.separator); // Windows \  Linux /

        // 构建 File对象的三种方式
        // 1.

        // 2.

        // 3

        /**
         * File对象有3种形式表示的路径
         * 1.getPath() 获取传入的路径
         * 2.getAbsolutePath() 返回绝对路径
         * 3.getCanonicalPath() 规范路径
         * 规范路径和绝对路径的区别：
         * 绝对路径：E:\JavaProject\java-learning-directory\.\test.text
         * 规范路径：E:\JavaProject\java-learning-directory\test.txt
         * 规范路径就是把.和..转换成标准的绝对路径后的路径 相当于去掉 . 和 ..
         * 注意：如果传入的是相对路径，在使用 getAbsolutePath 和 getCanonicalPath方法时
         * 只是用项目所在目录 加上传入时的路径进行拼接。
         */
        String path = file.getPath();
        System.out.println(path);// .\test.text
        String absolutePath = file.getAbsolutePath();
        System.out.println(absolutePath);// E:\JavaProject\java-learning-directory\.\test.text
        String canonicalPath = file.getCanonicalPath();// E:\JavaProject\java-learning-directory\test.text
        System.out.println(canonicalPath); // E:\JavaProject\java-learning-directory\test.txt
        /**
         * 构建File对象，传入的文件是不会报错，只有调用相关API时，
         * 才会检测文件是否真实的存在。
         * 要绝对路径才行
         * isFile（） 判断该File对象是否是一个已存在的文件
         * isDirectory()，判断该File对象是否是一个已存在的目录
         */
        boolean file1 = file.isFile();
        System.out.println(file1 ?"文件存在":"文件不存在");
        // 目录
        File dir = new File("E:\\JavaProject\\java-learning-directory\\CommonClass\\src\\com\\io\\files\\dirs");
        boolean directory = dir.isDirectory();
        System.out.println(directory?"目录存在":"目录不存在");
        System.out.println("--------");
        // 获取目录下面的文件
        File[] files = dir.listFiles();
        for (File f : files) {
            String name = f.getName();
            System.out.println(name);
        }

        // 获取文件或目录权限
        /**
         * boolean canRead()    是否可读
         * boolean canWrite()   是否可写
         * boolean canExecute() 是否执行
         */
        System.out.println("-------");
        boolean b = file.canRead();
        System.out.println(b?"可读":"不可读"); //  可读
        boolean w = file.canWrite();
        System.out.println(w?"可写":"不可写"); // 可写
        boolean x = file.canExecute();
        System.out.println(x?"可执行":"不可执行"); // 可执行

        // 创建和删除文件,临时文件
        System.out.println("----创建和删除文件---");
        File createFile = new File(url+"dirs\\marriage.txt");
        boolean existFile = createFile.isFile();
        if (existFile) {
            System.out.println("文件已经存在了");
        } else {
            // 创建目录
            if(createFile.createNewFile()) {
                System.out.println("创建成功");
            } else {
                System.out.println("文件创建失败！");
            }
        }
        // 删除文件
        if (existFile) {
            // 存在即删除
            boolean delete = createFile.delete();
            System.out.println(delete ?"删除成功" :"删除失败");
        } else {
            System.out.println("文件已经不存在了");
        }

        // 创建临时文件和JVM退出时自动删除该文件。
        System.out.println("-- 临时文件 --");
        // 创建临时文件 文件前缀和后缀
        File tempFile = File.createTempFile("tmp-", ".txt");
        System.out.println(tempFile.getAbsolutePath());
        System.out.println(tempFile.isFile());
        // JVM退出时自动删除
        tempFile.deleteOnExit();
    }

    // 构建File对象 方式一： new File(String pathname) 根据绝对路径构建一个 File对象
    @Test
    public void createFileOne() {
        File file = new File("E:\\1.txt");
        try {
            file.createNewFile();
            System.out.println("创建成功！");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("创建失败");
        }
    }

    // 构建File对象 方式二：new File(String parent,String child) 根据父目录文件夹路径 + 子路径构建
    @Test
    public void createFileTwo() {
         // 目录+ 文件名
        File file = new File("E:\\", "2.txt");
        try {
            file.createNewFile();
            System.out.println("创建文件成功！");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("创建文件失败");
        }
    }

    // 构建File对象 方式三：new File(File parent,String child) 根据父目录File对象 + 子路径构建
    @Test
    public void createFileThree() {
        File fatherPath = new File("E:\\");
        File file = new File(fatherPath, "3.txt");
        try {
            file.createNewFile();
            System.out.println("创建文件成功");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("创建文件失败");
        }
    }

    @Test
    public void getInfo() {
        // 获取文件信息
        File file = new File("E:\\test\\1.txt");
        boolean exists = file.exists();
        if (exists) {
            System.out.println("文件已经存在");
        } else {
            // 创建文件
            try {
                file.createNewFile();
                System.out.println("创建成功");
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("创建失败");
            }
        }
        // 获取文件信息
        String parent = file.getParent();
        // 获取父级目录
        System.out.println(parent);
        long length = file.length();
        System.out.println(length);// 154
    }
}
